import numpy as np
from sklearn.linear_model import Ridge
from sklearn.decomposition import PCA
from sklearn.linear_model import LinearRegression
from sklearn import preprocessing
import pandas as pd
from sklearn.cluster import KMeans
'''
任务如下：
1.读取data5.txt数据，其中第1-9列为自变量x，最后一列为因变量y
2.构建岭回归模型，并返回其自变量系数向量a1（数组）和截距(常数项)b1
3.对x进行主成分分析，并提取主成分，其中要求累计贡献在0.8以上
4.基于提取主成分，构建线性回归模型，返回其自变量系数向量a2（数组）和截距(常数项)b2
5.对x进行相关性分析，并返回相关系数矩阵r
6.读取data6.txt数据,进行zscore、minmax、maxabs、robust四种标准化，并返回标准化后的结果
  ，分别用zscore、minmax、maxabs和robust变量来表示
7.读取data7.txt数据，字段指定为'id', 'amount', 'income', 'datetime', 'age'，数据集记为df
8.对datetime数据离散化为星期值，对age数据离散化为0-40,40-80,>80三个区间段进行离散化，
   其中离散化后的数据覆盖原来的数据，datetime字段名称不变，age字段名称变为age2
9.对amount按0-200,200-1000,1000-5000,5000-10000四个区间段进行离散化和均值聚类离散化
   离散化后的数据字段记为amount1，amount2
10.对income按其平均值作为分界线，分为低压平均值和高于平均值两类进行离散化，分别用0和1来代替，
    离散化后的数据字段记为income1，
11.最终处理后的数据集df其字段依次为：
   id, amount, income, datetime, age2，amount1，amount2，income1
'''
#-----------------------------------------------------------------------------

data=np.loadtxt('data5.txt',delimiter='\t')
x,y=data[:,:-1],data[:,-1]#切分自变量
#构建分水岭模型
model_ridge=Ridge(alpha=1.0)
model_ridge.fit(x,y)
a1=model_ridge.coef_
b1=model_ridge.intercept_

#主成分分析
pca=PCA(n_components=0.8)          #这里设置累计贡献率为95%以上。
pca.fit(x)
pca_features=pca.transform(x)
#建立回归模型
model_liner=LinearRegression()
model_liner.fit(x,y)
a2=model_liner.coef_
b2=model_liner.intercept_

#对x进行相关性分析
r=np.corrcoef(x,rowvar=0).round(2)

##读取data6.txt文件
data1=np.loadtxt('data6.txt',delimiter='\t')
#进行Z-score标准化处理
zscore_scaler=preprocessing.StandardScaler()#建立对象
zscore=zscore_scaler.fit_transform(data1)

#minmax标准化处理
minmax_scaler=preprocessing.MinMaxScaler()
minmax=minmax_scaler.fit_transform(data1)

#maxbs标准化处理
maxbsscaler=preprocessing.MaxAbsScaler()
maxabs=maxbsscaler.fit_transform(data1)

#robust标准化处理
robustscaler=preprocessing.RobustScaler()
robust=robustscaler.fit_transform(data1)


#读取data7文件
df=pd.read_table('data7.txt',names=['id','amount','income','datetime','age'])

#8.对datetime数据离散化为星期值，对age数据离散化为0-40,40-80,>80三个区间段进行离散化，
#   其中离散化后的数据覆盖原来的数据，datetime字段名称不变，age字段名称变为age2
#转化为datetime的格式
df['datetime']=list(map(pd.to_datetime,df['datetime']))
df['datetime']=[i.weekday() for i in df['datetime']]

map_df=pd.DataFrame([['0-10','0-40'],['10-20','0-40'],['20-30','0-40'],
                     ['30-40','0-40'],['40-50','40-80'],['50-60','40-80'],
                     ['60-70','40-80'],['70-80','40-80'],['80-90','>80'],['>90','>80']],
               columns=['age','age2'])
#数据框关联匹配
df_tmep=df.merge(map_df,left_on='age',right_on='age',how='inner')
#丢弃age的列
df=df_tmep.drop('age',1)

#9.对amount按0-200,200-1000,1000-5000,5000-10000四个区间段进行离散化和均值聚类离散化
#   离散化后的数据字段记为amount1，amount2


bins=[0,200,1000,5000,10000]
df['amount1']=pd.cut(df['amount'],bins)

#均值聚类离散化
data3=df['amount']
data_reshape=data3.values.reshape((data3.shape[0],1))
model_kmeans=KMeans(n_clusters=4,random_state=0)
kmeans_result=model_kmeans.fit_predict(data_reshape)
df['amount2']=kmeans_result

#10.对income按其平均值作为分界线，分为低压平均值和高于平均值两类进行离散化，分别用0和1来代替，
#    离散化后的数据字段记为income1，

binarize_scaler=preprocessing.Binarizer(threshold=df['income'].mean())
income_tmp=binarize_scaler.fit_transform(df[['income']])
income_tmp.resize(df['income'].shape)
df['income1']=income_tmp







